home *** CD-ROM | disk | FTP | other *** search
- ⓪ (* -----------------------------------------------------⓪#Modula Compiler /3.6a/⓪#-----------------------------------------------------⓪#⓪#Codeerzeugung für Main-Module⓪#⓪$30.3.85 GDOS Version⓪%7.6.85 bessere Code-Erzeugung fuer StatLink-Verfolgung⓪%8.6.85 bessere Code-Erzeugung fuer Load #0 (CLR)⓪$30.7.85 Interrupt-faehiger Code fuer Subrange Check⓪%7.8.85 Interrupt-Level setzen⓪"{ 12.8.85 NEG.W D0 statt AND.W D7,D0 }⓪$15.8.85 RTE auch in ModulBody bei Priority >= 0⓪$27.8.85 wieder AND.W D7,D0 eingefuehrt⓪#17.10.85 OR & AND statt MOVE to SR bei Interrupt-Level-Aenderung;⓪-MOVE (A7)+,SR statt RTE bei Ende einer Interrupt-Routine⓪#22.02.86 Neuordnung der Texte⓪#14.04.86 Put147 implementiert⓪#15.04.86 Put148, Put149 implementiert; Put119 gestrichen⓪#16.04.86 Put150 implementiert⓪#21.04.86 mulu #1 in Put20 verhindert⓪#12.06.86 Aenderung vom 21.4. funktioniert jetzt wirklich⓪#28.07.86 Put151 implementiert⓪#17.10.86 Put200-Put210 fuer Byte-Handling⓪-Kopierschleifen Put211, 212 fuer gerade oder ungerade Laenge;⓪-Arraygroessen ueber 64K Wort moeglich⓪#18.10.86 Put213 fuer ForLoops;⓪-Peephole-Optimierung auf zwei Ebenen erweitert⓪#19.10.86 Peephole-Behandlung in Put73 korrigiert⓪#21.10.86 Put66/67 und Movecut hinterlassen Info ueber MOVE.W/L source,D0;⓪-Put72 kuerzt MOVE src,A0 auch im vorletzten Befehl;⓪-Put20 ruft Put72 auf.⓪#22.10.86 Put209 fuer Byte-Subrangecheck; alle Unsigned-SubrangeChecks⓪-(95, 97, 209) jetzt ohne Vergleich auf Untergrenze Null;⓪-put141 erlaubt Zuweisung von Arrays > 32K;⓪-AND D7,dest durch ANDI.W #1,dest ersetzt in put43/44/134⓪#23.10.86 Put74 erlaubt Long-Wert;⓪-Put214 zur Formatwandlung Char -> String [1]⓪#24.10.86 Put74 und Put210 erzeugen Endmarken 0.W bzw 0.B;⓪-CSP kennt neue Runtime-Prozeduren TRAN, IOTR, NEWP fuer Prozesse⓪#27.10.86 Put73 erzeugt fuer Wort-Offset LEA statt ADDA (kuerzbar)⓪ tt 30.10.86 PutDebug statt Put76⓪$1.11.86 Put214 (Char -> String [1]) erzeugt fuer Atari keinen Code mehr;⓪-alle Put-Routinen fuer Bytes auf nachfolgenden Sync geaendert;⓪-Peephole-Opt. put211 gegen 212 implementiert⓪#25.11.86 in put200.. jeweils SUBQ.L #1,A3 berichtigt (war SUBQ.B);⓪-put218 implementiert und NICHT getestet⓪#30.11.86 Test und Korrektur von put218⓪-put138 erzeugt wieder rechtsbuendige CHARs fuer Gepard-Std.⓪#19.12.86 put219 checkt Zugriff ueber NIL-Pointer; neuer TRAP 7 !⓪#20.12.86 put220 zum Umkopieren von Open Arrays als Value-Parameter;⓪-neue Runtime-Prozedur @COPY dafuer.⓪#16. 1.87 Umstellung A1/A2 -> A5/A5 in Atari-Version⓪#18. 1.87 put221,222 fuer Value-Uebergabe von Open Arrays⓪#29. 1.87 put221 rettet Adr vom Stack, falls Aufruf ueber ProcVar erfolgt.⓪#30. 1.87 put220 umgestellt: erzeugt jetzt Code fuer Uebergabe Open Array⓪.an Open Array by Val; neue RuntimeProc @COPS.⓪#12. 2.87 put212bytes implementiert⓪#15. 2.87 Atari-Version: RangeErr jetzt mit Trap #0,9 statt Trap #0,0.⓪-put221 kopiert Arrays von ungeraden Adressen jetzt mit Hilfsreg.⓪-byteweise auf den A7-Stack; dadurch Umweg ueber (A3) gespart.⓪#16. 2.87 put211bytes implementiert;⓪-put7 kopiert bis zu 16 Byte Parameter ohne Schleife⓪#17. 2.87 put221bytes implementiert === nicht getestet ===⓪#26. 2.87 put221bytes korrigiert⓪#25. 3.87 Allocate/DeAllocate bei Atari GROSS schreiben⓪#16.04.87 Trap7 bei Gepard mit erweiterem Word !⓪#09.05.87 Atari: TRAP für Errors: #6, für Debug: #5; Errornummern geändert⓪#15.06.87 put117 (Real-Abs) für neues Atari-Realformat⓪#18.06.87 put131 mit nachfolgendem Ergebnis-TST für folgende Rangechecks⓪$2.07.87 put5, put6: MOVEM statt einzelner MOVEs beim Register-Retten,⓪/für Atari Reihenfolge MOVEM und LINK/UNLK vertauscht;⓪-putRET: Atari-Version auch im Module Body mit UNLK.⓪$3.07.87 put203a, put204a: Konvertierung Long <> Byte, unsigned;⓪-put56 benutzt für Stackcheck Var. 'StackReserve'.⓪#14.07.87 put5: A7 wird richtig gesetzt, auch bei lok. Procs;⓪3Optimierung bei Put7 (TT)⓪#21.07.87 TT UNLK-Erzeugung in Modulbody wieder raus.⓪#22.07.87 TT STPROC: @LSTN neu⓪#23.07.87 TT PutRet: Priority-Restore wird zw. Reg-Restore und UNLK⓪0gelegt. Put6a in Put6d und Put6e zerteilt; put146 und⓪0put6c angepaßt für Atari.⓪#03.01.88 TT PUT6C korrigiert (D3 gerettet)⓪#28.05.88 TT put56 optimiert; put56b neu: faßt put5 & put56 zusammen und⓪1ruft Runtime-Funktionen zum Link auf; STPROC um '@RES1/2'⓪1erweitert.⓪#07.01.90 TT put56b übergibt nun Bereich als Long statt Word; put5 kann⓪2auch Long-LINK gen.⓪#28.01.90 TT PutLinkWOcopy neu: Macht LINK, sodaß Parms auf A3-Stack bleiben⓪#08.02.90 TT 'freeRegs' wird beim Retten/Rückladen der Regs bei Proc-Entry⓪0& -Exit berücksichtigt⓪#-----------------------------------------------------⓪ *)⓪ ⓪ ⓪ (**** Lokal benoetigte Vorwaerts-Referenzen ****)⓪ ⓪ FORWARD putIncA3;⓪ FORWARD Put66;⓪ FORWARD Put33w;⓪ FORWARD put216;⓪ FORWARD SetPriority;⓪ ⓪ (**** Codeerzeugung: ****)⓪ ⓪ PROCEDURE MOVECUT;⓪ BEGIN⓪ ASSEMBLER⓪*TST.L D7⓪*BMI.L CLEARCUT ;letzter Befehl war CLR.x (A3)+⓪*SWAP D7⓪*ANDI.W #$FFC0,D0⓪*OR.W D7,D0⓪*⓪*; einige Befehle koennen voellig entfallen:⓪*⓪*CMPI.W #$2048,D0 ;MOVE.L A0,A0?⓪*BEQ MOVECUT1⓪*CMPI.W #$3000,D0 ;MOVE.W D0,D0?⓪*BEQ MOVECUT1⓪*CMPI.W #$2000,D0 ;MOVE.L D0,D0?⓪*BEQ MOVECUT1⓪*CMPI.W #$2848,D0 ;MOVE.L A0,A4?⓪*BNE MOVECUT2⓪*⓪*;move.l a0,a4 verhindern, wenn moeglich⓪*⓪*MOVE.L D7,-(A7)⓪*MOVE.L Peephole,D7⓪*CMP.B #4,D7 ;vorher war move #long -> a0 ?⓪*BEQ ok⓪*CMP.B #5,D7 ;vorher lea source,a0 ?⓪*BNE MoveCut3 ;leider nix zu machen⓪ ok ADDQ.L #4,A7⓪*LSR.W #8,D7 ;Pos. des zu aendernden Opcodes berechnen⓪*ADDQ.W #2,D7⓪*NEG.W D7⓪*ORI.W #$0800,-2(A4,D7.W) ;Dest A0 zu A4 machen⓪@;beachte Offset -2: patchen im vorigen Bef.⓪*CLR.W D7⓪*BRA MoveCut4⓪ MoveCut3 MOVE.L (A7)+,D7 ;Opcode muss doch erzeugt werden⓪*⓪*; ZielAdresse fuer den neuen Code bestimmen⓪*⓪ MoveCut2 SWAP D7⓪*MOVE.W D7,-(A7)⓪*LSR.W #8,D7⓪*ADDQ.W #2,D7⓪*NEG.W D7⓪*MOVE.W D0,0(A4,D7.W)⓪*MOVE.W (A7)+,D7⓪*CMP.W #$207C,D0 ;move.l #data,a0 erzeugt?⓪*BEQ longA0⓪*AND.W #$0FC0,D0 ;Dest-Feld betrachten⓪*BNE done⓪*ADDQ.B #7,D7 ;Data -> EvalStk zu Data -> D0 machen⓪*RTS⓪ longA0 MOVE.L #$404,D7 ;#ADR->A0 GEGEN (A0) KUERZBAR⓪*RTS⓪ MoveCut1 MOVE.L Peephole,D7 ;und Info ueber vorigen ausgraben⓪ MoveCut4 SUBQ.L #2,A4 ;letzten Befehl vergessen⓪*CLR.L Peephole⓪*RTS⓪*⓪*;wir basteln uns einen CLR-Opcode...⓪ ⓪ !CLEARCUT MOVE.W D0,-(A7)⓪*AND.W #0000000111000000%,D0 ;Dest Mode rausfiltern⓪*CMP.W #0000000001000000%,D0 ;ist das ein AReg direkt?⓪*BEQ MOVEAD ;schade: ein MoveAddress⓪*MOVE.W (A7)+,D0⓪*MOVE.W #$4200,D7 ;high byte von CLR⓪*LSR.W #3,D0⓪*MOVE.B D0,D7 ;mode steht richtig in D7⓪*AND.B #00111000%,D7 ;Rest wegmaskiert⓪*LSR.W #1,D0⓪*LSR.B #5,D0 ;reg steht richtig⓪*OR.B D0,D7⓪*CLR.B D0⓪*LSR.W #2,D0 ;len steht richtig⓪*OR.B D0,D7⓪*BTST #6,D7⓪*BEQ clear1 ;ist CLR.L⓪*BCLR #7,D7 ;CLR.W geschickterweise anders codiert!⓪ !clear1 MOVE.W D7,-2(A4)⓪*BRA done⓪ !movead MOVE.W (A7)+,(A4)+ ;nix zu kuerzen bei MOVEA⓪*MOVE.L D7,PeepHole ;normale Erzeugung eines neuen Befehls⓪ !done CLR.W D7 ;bei einfacher Kuerzung: Peephole haelt Wert⓪ END⓪ END MOVECUT;⓪ ⓪ (* Schade: Hier wuerden MOVEs mit Source- und DestAdr entstehen,⓪0wobei einer der Operanden verschoben werden muss -⓪0wegen des moeglichen Eintrags in die RelozierListe leider⓪0verboten! Insbes. muessten Source-Operanden VOR die⓪0Zieladresse gebastelt werden!⓪0⓪ PROCEDURE AssignCut;⓪ ⓪ (* Prueft vor "MOVE.x source,(A4)", ob vorher LEA source2,A4 oder⓪#MOVE.L #data,A4 steht; wenn moeglich wird direkte Zuweisung erzeugt.⓪#⓪#D0 = zu erzeugender Opcode⓪!*)⓪ ⓪ BEGIN ASSEMBLER⓪(CMP.B #7,D7 ;LEA nach A4 ?⓪(BEQ wasLEA⓪(CMP.B #8,D7 ;MOVE #data,A4?⓪(BEQ wasMOVE⓪(MOVE.W D0,(A4)+⓪(CLR.W D7⓪(RTS⓪ wasLEA AND.W #$F03F,D0 ;Destination EA ausblenden⓪(MOVE.W D7,-(A7) ;merken wegen Offset-Info⓪(LSR.L #3,D7 ;Reg und Mode der SourceAdr trennen⓪(AND.L #$0007E000,D7 ;alles ausser Reg/ModeFeld loeschen⓪(LSR.W #7,D7 ;Reg an richtiger Position⓪(OR.W D7,D0⓪(SWAP D7⓪(LSL.W #6,D7 ;Mode an richtiger Position⓪(OR.W D7,D0⓪(MOVE.W (A7)+,D7⓪(BRA putOp⓪ wasMOVE AND.W #$F03F,D0 ;Destination EA ausblenden⓪(OR.W #$0E40,D0 ;"Absolute long" einsetzen⓪ putOp LSR.W #8,D7 ;ZielAdr fuer Patch berechnen⓪(ADDQ.W #2,D7⓪(NEG.W D7⓪(MOVE.W D0,0(A4,D7.W) ;und neuen Op eintragen⓪(CLR.W D7⓪&END⓪ END AssignCut;⓪ *)⓪ ⓪ PROCEDURE pushRegs;⓪"BEGIN⓪$ASSEMBLER⓪)(*$C+*)⓪)MOVE.L MM2Comp2.freeVarRegs,D0⓪)BSET #MM2Comp2.A5,D0 ; das wurde schon gerettet durch LINK⓪)MOVE.L D0,MM2Comp2.freeVarRegs⓪)JSR MM2Comp2.saveVarRegs⓪)(*$C=*)⓪$END⓪"END pushRegs;⓪ ⓪ PROCEDURE popRegs;⓪"BEGIN⓪$ASSEMBLER⓪)(*$C+*)⓪)JSR MM2Comp2.restoreVarRegs⓪)(*$C=*)⓪$END⓪"END popRegs;⓪ ⓪ PROCEDURE Put6e; (* UNLINK am Prozedurende *)⓪ BEGIN⓪ ASSEMBLER⓪ (*$ ? Gepard: MOVE.W #$4E59,(A4)+ ;unlk a1 *)⓪ ⓪ (*$ ? Atari: MOVE.W #$4E5D,(A4)+ ;unlk a5 *)⓪.CLR.W D7⓪ END⓪ END Put6e;⓪ ⓪ PROCEDURE Put6d; (* Register-Restore am Prozedurende *)⓪ BEGIN⓪ ASSEMBLER⓪ (*$ ? Gepard: MOVE.L #$4CDF1400,(A4)+ ;movem.l (a7)+,a2/a4 *)⓪ ⓪ (*$ ? Atari: JSR popRegs *)⓪.CLR.W D7⓪ END⓪ END Put6d;⓪ ⓪ PROCEDURE Put6B;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W #$4E75,(A4)+ ;RTS⓪)CLR.W D7⓪ END⓪ END Put6B;⓪ ⓪ PROCEDURE Put6c;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪)MOVE.W #$46DF,(A4)+ ;MOVE.W (A7)+,SR *)⓪ (*$ ? Atari:⓪)MOVE.W #$321F,(A4)+ ;MOVE.W (A7)+,D1⓪)MOVE.L D3,-(A7)⓪)MOVEQ #36,D3 ;JSR @PRIO⓪)JSR csp⓪)MOVE.L (A7)+,D3 *)⓪)CLR.W D7⓪&END⓪ END Put6c;⓪ ⓪ FORWARD BRAToLabelD0;⓪ ⓪ PROCEDURE jmpToRet;⓪"BEGIN⓪$ASSEMBLER⓪)MOVE.L RetAddr,D0⓪)JMP BRAToLabelD0⓪$END⓪"END jmpToRet;⓪ ⓪ PROCEDURE PutRET;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A4,RetAddr ;Einsprungadr. f. weitere RETURNs merken⓪)⓪)MOVE.L D0,-(A7)⓪)MOVE.L options,D0⓪)BTST #12,D0 ;L- schaltet auch SR-Rettung ab!⓪)BEQ doRTS⓪)⓪)TST.W modflag⓪)BNE doPrio ;MODULE BODY⓪ ⓪ (*$ ? Atari: ; Erst MOVEM, dann Priority, dann UNLK:⓪)MOVE.L VarA3Ofs,D0 ;ggf. A3 abräumen⓪)NEG.L D0⓪)JSR putIncA3 ;SUB #<D0>,A3⓪)JSR put6d ;gerettete nicht-temp.Regs zurück⓪)TST.W priority⓪)BMI noPrio⓪)CMPI.W #1,GLOBAL ;lokale PROC:⓪)BNE noPrio ; Prio bleibt erhalten⓪)JSR Put6c ;MOVE.W (a7)+,sr erzeugen⓪ !noPrio JSR Put6e ;UNLK⓪ *)⓪ ⓪ (*$ ? Gepard: ; Erst UNLK, dann Priority, dann MOVEM:⓪)JSR put6e ;UNLK⓪)TST.W priority⓪)BMI noPrio⓪)CMPI.W #1,GLOBAL ;lokale PROC:⓪)BNE noPrio ; Prio bleibt erhalten⓪)JSR Put6c ;MOVE.W (a7)+,sr erzeugen⓪ !noPrio JSR Put6d ;MOVEM (A7)+,A2/A4⓪ *)⓪)BRA doRTS⓪)⓪ doPrio ; Body:⓪)TST.W priority⓪)BMI doRTS⓪)JSR Put6c ;MOVE.W (a7)+,sr erzeugen⓪ ⓪ !doRTS ; Bei $E+ TRAP f. Proc-Namensausgabe erzeugen⓪)MOVEQ #67,D0 ; markiert Exit der Proc⓪)JSR TraceProc⓪)⓪)JSR Put6b ;RTS⓪ !ready MOVE.L (A7)+,D0⓪ END⓪ END PutRET;⓪ ⓪ PROCEDURE Put0;⓪ BEGIN ASSEMBLER⓪)MOVE.W A4,D0⓪)CLR.W D7⓪)BTST #0,D0⓪)BEQ Put01⓪)CLR.B (A4)+⓪ put01 RTS⓪ END⓪ END Put0;⓪ ⓪ PROCEDURE Put2;⓪ BEGIN ASSEMBLER⓪)CLR.W (A4)+⓪)CLR.W D7⓪&END⓪ END Put2;⓪)⓪ PROCEDURE Put3;⓪ BEGIN ASSEMBLER⓪(CLR.L (A4)+⓪&END⓪ END Put3;⓪ ⓪ PROCEDURE putIncA3;⓪"BEGIN⓪$ASSEMBLER⓪)TST.L D0⓪)BEQ.W incEnd⓪)BMI doDec⓪)⓪)CMPI.L #8,D0⓪)BHI noQuick⓪)⓪)ANDI.W #7,D0⓪)LSL.W #8,D0⓪)LSL.W #1,D0⓪)ORI.W #$508B,D0 ;ADDQ #<D0>,A3⓪)MOVE.W D0,(A4)+⓪)BRA incEnd⓪ ⓪ noQuick CMPI.L #$7FFE,D0⓪)BHI noWord⓪)MOVE.W #$D6FC,(A4)+⓪)MOVE.W D0,(A4)+ ;ADDA.W #<D0>,A3⓪)BRA incEnd⓪ ⓪ noWord MOVE.W #$D7FC,(A4)+⓪)MOVE.L D0,(A4)+ ;ADDA.L #<D0>,A3⓪)BRA incEnd⓪)⓪ doDec NEG.L D0⓪)CMPI.L #8,D0⓪)BHI noQuickN⓪)⓪)ANDI.W #7,D0⓪)LSL.W #8,D0⓪)LSL.W #1,D0⓪)ORI.W #$518B,D0 ;SUBQ #<D0>,A3⓪)MOVE.W D0,(A4)+⓪)BRA incEnd⓪ ⓪ noQuickN CMPI.L #$7FFE,D0⓪)BHI noWordN⓪)MOVE.W #$96FC,(A4)+⓪)MOVE.W D0,(A4)+ ;SUBA.W #<D0>,A3⓪)BRA incEnd⓪ ⓪ noWordN MOVE.W #$97FC,(A4)+⓪)MOVE.L D0,(A4)+ ;SUBA.L #<D0>,A3⓪)⓪ incEnd⓪$END⓪"END putIncA3;⓪ ⓪ PROCEDURE putIncA7;⓪"BEGIN⓪$ASSEMBLER⓪)TST.L D0⓪)BEQ.W incEnd⓪)BMI doDec⓪)⓪)CMPI.L #8,D0⓪)BHI noQuick⓪)⓪)ANDI.W #7,D0⓪)LSL.W #8,D0⓪)LSL.W #1,D0⓪)ORI.W #$508F,D0 ;ADDQ #<D0>,A7⓪)MOVE.W D0,(A4)+⓪)BRA incEnd⓪ ⓪ noQuick CMPI.L #$7FFE,D0⓪)BHI noWord⓪)MOVE.W #$DEFC,(A4)+⓪)MOVE.W D0,(A4)+ ;ADDA.W #<D0>,A7⓪)BRA incEnd⓪ ⓪ noWord MOVE.W #$DFFC,(A4)+⓪)MOVE.L D0,(A4)+ ;ADDA.L #<D0>,A7⓪)BRA incEnd⓪)⓪ doDec NEG.L D0⓪)CMPI.L #8,D0⓪)BHI noQuickN⓪)⓪)ANDI.W #7,D0⓪)LSL.W #8,D0⓪)LSL.W #1,D0⓪)ORI.W #$518F,D0 ;SUBQ #<D0>,A7⓪)MOVE.W D0,(A4)+⓪)BRA incEnd⓪ ⓪ noQuickN CMPI.L #$7FFE,D0⓪)BHI noWordN⓪)MOVE.W #$9FFC,(A4)+⓪)MOVE.W D0,(A4)+ ;SUBA.W #<D0>,A7⓪)BRA incEnd⓪ ⓪ noWordN MOVE.W #$9FFC,(A4)+⓪)MOVE.L D0,(A4)+ ;SUBA.L #<D0>,A7⓪)⓪ incEnd⓪$END⓪"END putIncA7;⓪ ⓪ PROCEDURE PutLinkWOcopy;⓪"BEGIN⓪$ASSEMBLER⓪); LINK A5,#0⓪); MOVEM.L A6,-(A7)⓪); MOVE.L A3,A6⓪); MOVE.L D2,(A3)+ ; falls lok. Proc⓪); ADDI #<D0>,A3⓪)⓪)MOVE.L D0,-(A7)⓪)⓪)MOVE.W #$4E55,(A4)+ ;LINK A5,#..⓪)CLR.W (A4)+⓪)⓪)CMPI.W #1,GLOBAL ;globale Proc:⓪)BNE Put501⓪)JSR SetPriority ; Prio setzen⓪ put501⓪)JSR pushRegs ;Reg-Vars und A6 retten⓪)MOVE.W #$2C4B,(A4)+ ;MOVE.L A3,A6⓪)⓪)CMPI.W #1,GLOBAL ;globale Proc:⓪)BEQ Put502 ; kein STAT.LINK⓪)MOVE.W #$26C2,(A4)+ ;MOVE.L D2,(A3)+⓪)ADDQ.L #4,VarA3Ofs⓪ put502⓪)MOVE.L (A7)+,D0⓪)JSR putIncA3 ;ADD #<D0>,A3⓪)⓪)CLR.W D7⓪$END⓪"END PutLinkWOcopy;⓪ ⓪ PROCEDURE putLink;⓪"BEGIN⓪$ASSEMBLER⓪)CMPI.L #$FFFF8000,D0⓪)BLT long0⓪); Short-LINK erzeugen⓪)MOVE.W #$4E55,(A4)+ ;link a5,#..⓪)MOVE.W D0,(A4)+⓪)RTS⓪ long0 ; Long-LINK erzeugen⓪)MOVE.W #$2F0D,(A4)+ ;move.l a5,-(a7)⓪)MOVE.W #$2A4F,(A4)+ ;move.l a7,a5⓪)MOVE.W #$DFFC,(A4)+ ;adda.l #x,a7⓪)MOVE.L D0,(A4)+⓪$END⓪"END putLink;⓪ ⓪ PROCEDURE Put5; (* LINK am Prozeduranfang *)⓪ BEGIN ASSEMBLER⓪); LINK A5,#<D0>⓪); MOVE.L D2,-(A7)⓪); MOVE.L A7,A2⓪); MOVEM A6,-(A7)⓪); MOVE.L A2,A6⓪ ⓪ (*$ ? Gepard:⓪)MOVE.L #$48E70028,(A4)+ ;movem.l a2/a4,-(a7)⓪)CMPI.W #1,GLOBAL ;lokale Proc:⓪)BNE Put502 ; kein Prio setzen⓪)JSR SetPriority⓪ put502 MOVE.W #$4E51,(A4)+ ;link a1,#..⓪)MOVE.W D0,(A4)+⓪)CMPI.W #1,GLOBAL ;globale Proc:⓪)BEQ Put501 ; kein STAT.LINK⓪)MOVE.W #$2F02,(A4)+ ;move.l d2,-(a7)⓪ put501 MOVE.W #$244F,(A4)+ ;move.l a7,a2⓪)CLR.W D7 *)⓪)⓪ (*$ ? Atari:⓪)JSR putLink⓪)CMPI.W #1,GLOBAL ;globale Proc:⓪)BEQ Put501 ; kein STAT.LINK⓪)MOVE.W #$2F02,(A4)+ ;move.l d2,-(a7)⓪ put501 MOVE.W #$244F,(A4)+ ;move.l a7,a2⓪)CMPI.W #1,GLOBAL ;lokale Proc:⓪)BNE Put502 ; kein Prio setzen⓪)JSR SetPriority⓪ put502 JSR pushRegs ;Reg-Vars und A6 retten⓪)MOVE.W #$2C4A,(A4)+ ;move.l a2,a6⓪)CLR.W D7 *)⓪&END⓪ END Put5;⓪ ⓪ PROCEDURE Put7;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard: TST.W D1⓪.BNE put701⓪.MOVE.W #$2049,(A4)+ ;move.l a1,a0⓪.BRA put702⓪ put701 MOVE.W #$41E9,(A4)+ ;lea [d1](a1),a0⓪.MOVE.W D1,(A4)+ *)⓪.⓪ (*$ ? Atari: TST.W D1⓪.BNE put701⓪.MOVE.W #$204D,(A4)+ ;move.l a5,a0⓪.BRA put702⓪ put701 MOVE.W #$41ED,(A4)+ ;lea [d1](a5),a0⓪.MOVE.W D1,(A4)+ *)⓪.⓪ put702 MOVE.W D0,D1 ;aus DBF-Count VarSpace zurueckrechnen⓪.ADDQ #1,D1⓪.LSL.W #1,D1⓪.CMP.W #16,D1 ;kurz (ohne Loop kopierbar) ?⓪.BLS noloop⓪.⓪.JSR Put33w ;MOVE.L/MOVEQ #,D0⓪.MOVE.W #$3123,(A4)+ ;move.w -(a3),-(a0)⓪.MOVE.L #$51C8FFFC,(A4)+ ;dbf d0,-4⓪.CLR.W D7⓪.RTS⓪.⓪.; bis zu 16 Bytes mit 4 Moves direkt kopieren⓪ ⓪ mvLong MOVE.W #$2123,(a4)+ ;move.l -(a3),-(a0)⓪.SUBQ.W #4,D1⓪ noloop CMP.W #2,D1 ;wieviel noch zu kopieren ?⓪.BCS mvDone ;muss Null sein⓪.BHI mvLong ;muss >= 4 sein⓪.MOVE.W #$3123,(a4)+ ;move.w -(a3),-(a0) fuer den Rest⓪ mvDone CLR.W D7⓪ END⓪ END Put7;⓪ ⓪ PROCEDURE Put8;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$4EB9,(A4)+ ;jsr.l⓪)CLR.W D7⓪&END⓪ END Put8;⓪ ⓪ PROCEDURE Put25;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W #$26FC,(A4)+⓪)MOVE.L D7,Peephole⓪)MOVE.L #$003C0402,D7⓪ END⓪ END Put25;⓪ ⓪ (*⓪ PROCEDURE Put33; (* move.l #[d0],d0 oder moveq #[d0],d0 *)⓪ BEGIN ASSEMBLER⓪)CMPI.L #127,D0⓪)BLS Put3301⓪)CMPI.L #-127,D0⓪)BCC Put3301⓪)MOVE.W #$203C,(A4)+⓪)MOVE.L D0,(A4)+⓪)CLR.W D7⓪)RTS⓪ put3301 ANDI.W #$FF,D0⓪)ORI.W #$7000,D0⓪)MOVE.W D0,(A4)+⓪)CLR.W D7⓪&END⓪ END Put33;⓪ *)⓪ ⓪ PROCEDURE Put33w; (* move.w #[d0],d0 oder moveq #[d0],d0 *)⓪ BEGIN ASSEMBLER⓪)CMPI.W #127,D0⓪)BLS Put3301⓪)CMPI.W #-127,D0⓪)BCC Put3301⓪)MOVE.W #$303C,(A4)+⓪)MOVE.W D0,(A4)+⓪)CLR.W D7⓪)RTS⓪ put3301 ANDI.W #$FF,D0⓪)ORI.W #$7000,D0⓪)MOVE.W D0,(A4)+⓪)CLR.W D7⓪&END⓪ END Put33w;⓪ ⓪ (*⓪ PROCEDURE Put38;⓪ BEGIN⓪ ASSEMBLER⓪$CMPI.B #1,D7⓪)BEQ Put3801⓪)CMPI.B #3,D7⓪)BEQ Put3802⓪)MOVE.L #$4A636700,(A4)+ ; TST -(A3) BEQ ...⓪)CLR.W D7⓪)RTS⓪ put3801 LSR.W #8,D7⓪)SUBA.W D7,A4⓪)SWAP D7⓪)EORI.W #$6100,D7⓪)MOVE.W D7,(A4)+⓪)CLR.W D7⓪)RTS⓪ put3802 MOVE.W #$3023,D0⓪)JSR MOVECUT⓪)MOVE.W #$6700,(A4)+⓪)CLR.W D7⓪ END⓪ END Put38;⓪ *)⓪ ⓪ PROCEDURE Put39;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$6000,(A4)+⓪)CLR.W D7⓪ END⓪ END Put39;⓪ ⓪ (*⓪ PROCEDURE Put45;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$2F23,D0⓪)CMPI.B #2,D7⓪)BNE L1⓪)JMP MOVECUT⓪)!L1 MOVE.W D0,(A4)+⓪)CLR.W D7⓪ END⓪ END Put45;⓪ *)⓪ PROCEDURE Put46;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$6500,(A4)+⓪)CLR.W D7⓪ END⓪ END Put46;⓪ PROCEDURE Put47;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$6200,(A4)+⓪)CLR.W D7⓪ END⓪ END Put47;⓪ PROCEDURE Put48;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$6D00,(A4)+⓪)CLR.W D7⓪ END⓪ END Put48;⓪ PROCEDURE Put49;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$6E00,(A4)+⓪)CLR.W D7⓪ END⓪ END Put49;⓪ PROCEDURE Put50;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$2F0C,(A4)+⓪)CLR.W D7⓪ END⓪ END Put50;⓪ (*⓪ PROCEDURE Put51;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$285F,(A4)+⓪)CLR.W D7⓪)TST.L D1⓪)BMI Put5103⓪)CMPI.L #8,D1⓪)BLS Put5101 ;ADDQ⓪)MOVE.W #$0694,(A4)+⓪)MOVE.L D1,(A4)+ ;ADD.L⓪)RTS⓪ put5101 ANDI.W #7,D1⓪)LSL.W #8,D1⓪)LSL.W #1,D1⓪)ORI.W #$5094,D1⓪)MOVE.W D1,(A4)+⓪)RTS⓪ put5103 NEG.L D1⓪)CMPI.L #8,D1⓪)BLS Put5102 ;SUBQ⓪)MOVE.W #$0494,(A4)+⓪)MOVE.L D1,(A4)+⓪)RTS⓪ put5102 ANDI.W #7,D1⓪)LSL.W #8,D1⓪)LSL.W #1,D1⓪)ORI.W #$5194,D1⓪)MOVE.W D1,(A4)+⓪ END⓪ END Put51;⓪ PROCEDURE Put52;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$588F,(A4)+⓪)CLR.W D7⓪ END⓪ END Put52;⓪ PROCEDURE Put53;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.L #$2017B094,(A4)+⓪)CLR.W D7⓪ END⓪ END Put53;⓪ *)⓪ ⓪ PROCEDURE Put54;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$6100,(A4)+⓪)CLR.W D7⓪ END⓪ END Put54;⓪ ⓪ PROCEDURE Put55;⓪ BEGIN ASSEMBLER⓪); No valid RETURN⓪ (*$ ? Gepard:⓪)MOVE.W #$4E41,(A4)+ *)⓪ (*$ ? Atari:⓪)MOVE.W #$4E46,(A4)+⓪)MOVE #-9,(A4)+ *)⓪)CLR.W D7⓪&END⓪ END Put55;⓪ ⓪ PROCEDURE PutTRAPCaseErr;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$4E46,(A4)+⓪)MOVE #-23,(A4)+⓪)CLR.W D7⓪&END⓪ END PutTRAPCaseErr;⓪ ⓪ PROCEDURE Put56a; (* schneller Stackspace-Check *)⓪ BEGIN ASSEMBLER⓪)MOVE.L StackReserve,D1⓪)ADD.L D0,D1⓪)CMPI.L #$8000,D1⓪)BCS lower⓪)MOVE.W #$207C,(A4)+ ;move.l #xx,a0⓪)MOVE.L D1,(A4)+⓪)MOVE.W #$D1CB,(A4)+ ;adda.l a3,a0⓪)BRA c1⓪'lower⓪)MOVE.W #$41EB,(A4)+ ;lea xx(a3),a0 ; !tt 28.5.88⓪)MOVE.W D1,(A4)+⓪'c1⓪)MOVE.W #$B1CF,(A4)+ ; cmp.l a7,a0⓪ (*$ ? Gepard:⓪)MOVE.L #$65024E44,(A4)+ *)⓪ (*$ ? Atari:⓪)MOVE.L #$65044E46,(A4)+⓪)MOVE #-10,(A4)+ *)⓪)CLR.W D7⓪&END⓪ END Put56a;⓪ ⓪ PROCEDURE Put56b; (* kurzer Stackspace-Check *)⓪ BEGIN ASSEMBLER⓪)MOVEM.L D1/D3,-(A7)⓪)MOVE.L StackReserve,D1⓪)ADD.L D0,D1⓪)CMPI.L #$240,D0 ;max. 64 Bytes mehr auf Stack?⓪)BHI varLink ;nein -> variabler Link⓪)MOVEQ #41,D3 ;ja -> JSR @STK1: immer $240-Check machen⓪)BRA cont⓪ varLink CMPI.L #$8000,D0⓪)BCS useMoveW⓪)MOVE #$207C,(A4)+ ;MOVE.L #x,A0⓪)MOVE.L D0,(A4)+⓪)BRA call⓪ useMoveW MOVE #$307C,(A4)+ ;MOVE.W #x,A0⓪)MOVE.W D0,(A4)+⓪ call MOVEQ #42,D3 ;JSR @STK2⓪ cont JSR csp⓪)MOVEM.L (A7)+,D1/D3⓪ END⓪ END Put56b;⓪ ⓪ PROCEDURE Put66; (* MOVE.L -(A3),D0 *)⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$2023,D0⓪$CMPI.B #2,D7⓪$BNE L1⓪$JMP MOVECUT⓪ !L1 MOVE.W D0,(A4)+⓪$MOVE.L D7,Peephole⓪$MOVE.L #$00230009,D7 ;Long Data -(A3) -> D0⓪ END⓪ END Put66;⓪ ⓪ PROCEDURE Put67; (* MOVE.W -(A3),D0 *)⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$3023,D0⓪$CMPI.B #3,D7⓪$BNE L1⓪$JMP MOVECUT⓪ !L1 MOVE.W D0,(A4)+⓪$MOVE.L D7,Peephole⓪$MOVE.L #$0023000A,D7 ;Word Data -(A3) -> D0⓪ END⓪ END Put67;⓪ ⓪ PROCEDURE Put69;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$0480,(A4)+ ;sub.l #xx,d0⓪)CLR.W D7⓪&END⓪ END Put69;⓪ ⓪ PROCEDURE Put70;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$E348,(A4)+⓪)MOVE.L #$303B0006,(A4)+⓪)MOVE.L #$4EFB0002,(A4)+⓪)CLR.W D7⓪ END⓪ END Put70;⓪ ⓪ (*⓪ PROCEDURE Put72; (* versuchsweise mit Kuerzung des vorletzten Befehls *)⓪ BEGIN⓪ ASSEMBLER⓪)TST.B D7⓪)BEQ nix ;keine Information⓪)CMPI.B #2,D7⓪)BNE L1⓪)MOVE.W #$2063,D0⓪)JMP MOVECUT⓪ !L1 MOVE.L Peephole,D0⓪)CMPI.B #2,D0 ;voriger Befehl 'Long -> EvalStack' ?⓪)BNE nix⓪)⓪); jetzt Situation vor dem letzten Befehl wiederherstellen⓪)⓪)MOVEM.L A4/D7,-(A7) ;jetzigen Zustand retten⓪)LSR.W #8,D7 ;Offset zum vorigen Befehl ermitteln⓪)NEG.W D7⓪)LEA -2(A4,D7.W),A4 ;das wird der vorgetaeuschte Code-Ptr⓪)MOVE.L A4,-(A7)⓪)MOVE.L Peephole,D7 ;alte Peephole-Situation erzeugen⓪)CLR.L Peephole⓪)MOVE.W #$2063,D0⓪)JSR MoveCut⓪)CMPA.L (A7)+,A4 ;hat MoveCut A4 veraendert?⓪)BEQ noNop⓪)MOVE.W #$4E71,(A4) ;ja: weggekuerzten Befehl ueberNOPpen⓪ noNop MOVEM.L (A7)+,D7/A4⓪)RTS⓪ nix MOVE.W #$2063,(A4)+⓪)CLR.W D7⓪ END⓪ END Put72;⓪ ⓪ PROCEDURE Put74;⓪"(*⓪%Korrektur von A3 bei StringAssign mit SourceLen < DestLen:⓪%A3 um [D1.L] erhoehen. Wird nur mit geradem D1 aufgerufen.⓪%In der Atari-Version muss zunaechst eine Endmarke 00.W⓪%erzeugt werden, falls der String auf dem Stack noch keine⓪%hat; der restliche Offset wird durch Addition auf A3 erreicht.⓪"*)⓪ BEGIN ASSEMBLER⓪)TST.L D1⓪)BEQ Put7401 ;Offset ist Null⓪ (*$ ? Atari:⓪)MOVE.W #$425B,(A4)+ ;clr.w (a3)+⓪)SUBQ.L #2,D1⓪)BEQ Put7401 ;das war alles *)⓪)CMPI.L #$7FFF,D1⓪)BHI LongOff ;Offset passt nicht in ein Wort⓪)MOVE.W #$D6FC,(A4)+ ;adda.w #data,a3⓪)MOVE.W D1,(A4)+⓪)BRA put7402⓪ LongOff MOVE.W #$D7FC,(A4)+ ;adda.l #data,a3⓪)MOVE.L D1,(A4)+⓪ put7402 CLR.W D7⓪ put7401⓪)END⓪ END Put74;⓪ *)⓪ ⓪ PROCEDURE PutDebug;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪)ANDI.W #$F,D0⓪)ORI.W #$4E40,D0⓪)MOVE.W D0,(A4)+ ;TRAP #<D0>⓪)CLR.W D7 *)⓪ (*$ ? Atari:⓪)MOVE #$4E45,(A4)+⓪)MOVE D0,(A4)+⓪)CLR D7 *)⓪&END⓪ END PutDebug;⓪ ⓪ (*⓪ PROCEDURE Put77;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$6400,(A4)+⓪)CLR.W D7⓪&END⓪ END Put77;⓪ ⓪ PROCEDURE Put78;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$6800,(A4)+ ; BVC⓪)CLR.W D7⓪&END⓪ END Put78;⓪ *)⓪ ⓪ PROCEDURE Put79;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$0C40,(A4)+ ; CMPI.W⓪)CLR.W D7⓪&END⓪ END Put79;⓪ ⓪ PROCEDURE Put79b;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$0C80,(A4)+ ; CMPI.L⓪)CLR.W D7⓪&END⓪ END Put79b;⓪ ⓪ PROCEDURE Put80;⓪ BEGIN ASSEMBLER⓪); SUBI.W #_,D0⓪)MOVE.W #$0440,(A4)+⓪)CLR.W D7⓪&END⓪ END Put80;⓪ ⓪ PROCEDURE PutSubIW_D0; (* SUB.W #<D0>,D0 *)⓪"BEGIN⓪$ASSEMBLER⓪)TST.W D0⓪)BEQ nothing⓪)CMPI.W #8,D0⓪)BLS quick⓪)JSR Put80⓪)MOVE.W D0,(A4)+⓪)RTS⓪'quick⓪)ANDI.W #7,D0⓪)LSL.W #8,D0⓪)LSL.W #1,D0⓪)ORI.W #$5140,D0 ;SUBQ.W #<D0>,D0⓪)MOVE.W D0,(A4)+⓪'nothing⓪)CLR.W D7⓪$END⓪"END PutSubIW_D0;⓪ ⓪ PROCEDURE PutSubIL_D0; (* SUB.L #<D0>,D0 *)⓪"BEGIN⓪$ASSEMBLER⓪)TST.L D0⓪)BEQ nothing⓪)CMPI.L #8,D0⓪)BLS quick⓪)JSR Put69⓪)MOVE.L D0,(A4)+⓪)RTS⓪'quick⓪)ANDI.W #7,D0⓪)LSL.W #8,D0⓪)LSL.W #1,D0⓪)ORI.W #$5180,D0 ;SUBQ.L #<D0>,D0⓪)MOVE.W D0,(A4)+⓪'nothing⓪)CLR.W D7⓪$END⓪"END PutSubIL_D0;⓪"⓪ (*⓪ PROCEDURE Put81; (* WITH-Kopf *)⓪ BEGIN ASSEMBLER⓪.MOVE.W #$2F23,D0 ;move.l -(a3),-(a7)⓪.CMPI.B #2,D7⓪.BNE Put8101⓪.JSR MOVECUT⓪.BRA Put8102⓪ put8101 MOVE.W D0,(A4)+⓪ put8102⓪ (*$ ? Gepard: MOVE.L #$2F0A244F,(A4)+ ;move.l a2,-(a7); move.l a7,a2 *)⓪ (*$ ? Atari: MOVE.L #$2F0E2C4F,(A4)+ ;move.l a6,-(a7); move.l a7,a6 *)⓪.CLR.W D7⓪&END⓪ END Put81;⓪ ⓪ PROCEDURE Put82; (* WITH-Ende *)⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard: MOVE.L #$245F588F,(A4)+ ;move.l (a7)+,a2; addq.l #4,a7 *)⓪ (*$ ? Atari: MOVE.L #$2C5F588F,(A4)+ ;move.l (a7)+,a6; addq.l #4,a7 *)⓪.CLR.W D7⓪&END⓪ END Put82;⓪ ⓪ PROCEDURE Put85;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$3F23,D0 ;move.w -(a3),-(a7)⓪)CMPI.B #3,D7⓪)BNE L1⓪)JMP MOVECUT⓪)!L1 MOVE.W D0,(A4)+⓪)CLR.W D7⓪%END⓪ END Put85;⓪ ⓪ PROCEDURE Put86;⓪ BEGIN ASSEMBLER⓪)MOVE.L #$3017B054,(A4)+⓪)CLR.W D7⓪&END⓪ END Put86;⓪ ⓪ PROCEDURE Put87;⓪ BEGIN ASSEMBLER⓪)MOVE.W #$285F,(A4)+⓪)CLR.W D7⓪)TST.W D1⓪)BMI Put8703⓪)CMPI.W #8,D1⓪)BLS Put8701 ;ADDQ⓪)MOVE.W #$0654,(A4)+⓪)MOVE.W D1,(A4)+ ;ADD.W⓪)RTS⓪ put8701 ANDI.W #7,D1⓪)LSL.W #8,D1⓪)LSL.W #1,D1⓪)ORI.W #$5054,D1⓪)MOVE.W D1,(A4)+⓪)RTS⓪ put8703 NEG.W D1⓪)CMPI.W #8,D1⓪)BLS Put8702 ;SUBQ⓪)MOVE.W #$0454,(A4)+⓪)MOVE.W D1,(A4)+⓪)RTS⓪ put8702 ANDI.W #7,D1⓪)LSL.W #8,D1⓪)LSL.W #1,D1⓪)ORI.W #$5154,D1⓪)MOVE.W D1,(A4)+⓪ END⓪ END Put87;⓪ ⓪ PROCEDURE Put88;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W #$548F,(A4)+⓪)CLR.W D7⓪ END⓪ END Put88;⓪ ⓪ PROCEDURE Put106;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$5250,(A4)+⓪)CLR.W D7⓪ END⓪ END Put106;⓪ PROCEDURE Put107;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$5290,(A4)+⓪)CLR.W D7⓪ END⓪ END Put107;⓪ PROCEDURE Put108;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$D150,(A4)+⓪)CLR.W D7⓪ END⓪ END Put108;⓪ PROCEDURE Put109;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$D190,(A4)+⓪)CLR.W D7⓪ END⓪ END Put109;⓪ PROCEDURE Put110;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$5350,(A4)+⓪)CLR.W D7⓪ END⓪ END Put110;⓪ PROCEDURE Put111;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$5390,(A4)+⓪)CLR.W D7⓪ END⓪ END Put111;⓪ PROCEDURE Put112;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$9150,(A4)+⓪)CLR.W D7⓪ END⓪ END Put112;⓪ PROCEDURE Put113;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$9190,(A4)+⓪)CLR.W D7⓪ END⓪ END Put113;⓪ PROCEDURE Put114;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$4280,(A4)+⓪)CLR.W D7⓪ END⓪ END Put114;⓪ *)⓪ ⓪ PROCEDURE Put118;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$DEFC,(A4)+⓪)CLR.W D7⓪ END⓪ END Put118;⓪ ⓪ (*⓪ PROCEDURE Put126;⓪ BEGIN⓪ ASSEMBLER⓪#JSR Put67⓪$MOVE.W #$48C0,(A4)+⓪$CLR.W D7⓪ END⓪ END Put126;⓪ *)⓪ ⓪ PROCEDURE Put128;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #$36C0,(A4)+⓪$MOVE.L D7,Peephole⓪$MOVEQ #3,D7⓪ END⓪ END Put128;⓪ ⓪ (*⓪ PROCEDURE Put142;⓪ BEGIN⓪ ASSEMBLER⓪)CLR.W D7⓪)SUBQ.W #1,D0⓪)BCS Put1421 ;LOKAL⓪)BEQ Put1422 ;GLEICHE EBENE⓪ ⓪ (*$ ? Gepard:⓪)MOVE.W #$2052,(A4)+ ;move.l (a2),a0⓪ put1423 SUBQ.W #1,D0⓪)BEQ Put1424⓪)MOVE.W #$2050,(A4)+ ;move.l (a0),a0⓪)BRA Put1423⓪ put1424 MOVE.W #$2410,(A4)+ ;move.l (a0),d2⓪)RTS⓪ put1421 MOVE.W #$240A,(A4)+ ;move.l a2,d2⓪)RTS⓪ put1422 MOVE.W #$2412,(A4)+ ;move.l (a2),d2 *)⓪ ⓪ (*$ ? Atari:⓪)MOVE.W #$2056,(A4)+ ;move.l (a6),a0⓪ put1423 SUBQ.W #1,D0⓪)BEQ Put1424⓪)MOVE.W #$2050,(A4)+ ;move.l (a0),a0⓪)BRA Put1423⓪ put1424 MOVE.W #$2410,(A4)+ ;move.l (a0),d2⓪)RTS⓪ put1421 MOVE.W #$240E,(A4)+ ;move.l a6,d2⓪)RTS⓪ put1422 MOVE.W #$2416,(A4)+ ;move.l (a6),d2 *)⓪ ⓪&END⓪ END Put142;⓪ *)⓪ ⓪ PROCEDURE Put146;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪(MOVE.W #$40E7,(A4)+ ;MOVE SR,-(A7)⓪(MOVE.W #$007C,(A4)+ ;ORI #data,SR⓪(MOVE.W #$0700,(A4)+ ;erst mal hoechste Prioritaet setzen⓪(MOVE.W #$027C,(A4)+ ;ANDI #data,SR⓪(AND.W #7,D0 ;D0 enthaelt das Interrupt-Level⓪(LSL.W #8,D0⓪(OR.W #$F8FF,D0 ;alle anderen Bits leben lassen⓪(MOVE.W D0,(A4)+⓪ *)⓪ (*$ ? Atari:⓪(MOVE.W #$40E7,(A4)+ ;MOVE SR,-(A7)⓪(AND.W #7,D0 ;D0 enthaelt das Interrupt-Level⓪(LSL.W #8,D0⓪(MOVE.W #$323C,(A4)+ ;MOVE.W #x,D1⓪(MOVE.W D0,(A4)+⓪(MOVEQ #36,D3 ;JSR @PRIO⓪(JSR csp⓪ *)⓪(CLR.W D7⓪&END⓪ END Put146;⓪ ⓪ (*⓪ PROCEDURE Put147; (* Konfigurations-Dummy, bei $K+ am ModulRumpf-Anfang *)⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L #$60000004,(A4)+ ;bra.l +4⓪)MOVE.W #$4E75,(A4)+ ;rts⓪)CLR.L D7⓪ END⓪ END Put147;⓪ *)⓪ ⓪ PROCEDURE Put151; (* Restore A2/A6 bei EXIT aus WITH *)⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard: MOVE.W #$246F,(A4)+ ;movea.w [d0] (a7),a2 *)⓪ (*$ ? Atari: MOVE.W #$2C6F,(A4)+ ;movea.w [d0] (a7),a6 *)⓪.MOVE.W D0,(A4)+⓪.CLR.W D7⓪&END⓪ END Put151;⓪ ⓪ PROCEDURE Put203; (* Expand Byte to Word *)⓪ BEGIN ASSEMBLER⓪)JSR put216 ;pull byte -> D0⓪)MOVE.L #$024000FF,(A4)+ ;andi.w #$ff,d0⓪)CLR.W D7⓪)JMP put128 ;move.w d0,(a3)+⓪&END⓪ END Put203;⓪ ⓪ (*⓪ PROCEDURE Put205; (* Inc (Byte) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W #$5210,(A4)+ ;addq.b #1,(a0)⓪(CLR.W D7⓪&END⓪ END Put205;⓪ ⓪ PROCEDURE Put206; (* Dec (Byte) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W #$5310,(A4)+ ;subq.b #1,(a0)⓪(CLR.W D7⓪&END⓪ END Put206;⓪ ⓪ PROCEDURE Put207; (* Inc (Byte, x) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W #$D110,(A4)+ ;add.b d0,(a0)⓪(CLR.W D7⓪&END⓪ END Put207;⓪ ⓪ PROCEDURE Put208; (* Dec (Byte, x) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W #$9110,(A4)+ ;sub.b d0,(a0)⓪(CLR.W D7⓪&END⓪ END Put208;⓪ ⓪ PROCEDURE Put210; (* FOR-LaufVar inkr/dekr. (Bytes) *)⓪ BEGIN ASSEMBLER⓪)MOVE.W #$285F,(A4)+ ;move.l (a7)+,a4⓪)CLR.W D7⓪)TST.W D1⓪)BMI Put8703 ;Step ist negativ: SUBs erzeugen⓪)CMPI.W #8,D1⓪)BLS Put8701 ;addq tut's auch ->⓪)MOVE.W #$0614,(A4)+ ;add.b [d1],(a4)⓪)MOVE.W D1,(A4)+⓪)RTS⓪ put8701 ANDI.W #7,D1⓪)LSL.W #8,D1⓪)LSL.W #1,D1⓪)ORI.W #$5014,D1 ;addq.b #[d1],(a4) wird gebastelt⓪)MOVE.W D1,(A4)+⓪)RTS⓪ put8703 NEG.W D1⓪)CMPI.W #8,D1⓪)BLS Put8702 ;subq tut's auch ->⓪)MOVE.W #$0414,(A4)+ ;sub.b [d1],(a4)⓪)MOVE.W D1,(A4)+⓪)RTS⓪ put8702 ANDI.W #7,D1⓪)LSL.W #8,D1⓪)LSL.W #1,D1⓪)ORI.W #$5114,D1 ;subq.b #[d1],(a4) wird gebastelt⓪)MOVE.W D1,(A4)+⓪&END⓪ END Put210;⓪ ⓪ PROCEDURE Put213; (* FOR-LaufVar mit Obergrenze vergleichen *)⓪ BEGIN ASSEMBLER⓪)MOVE.L #$3017B014,(A4)+ ;move.w (a7),d0 ; cmp.b (a4),d0⓪)CLR.W D7⓪&END⓪ END Put213;⓪ *)⓪ ⓪ PROCEDURE put216; (* Pull Byte -(A3) -> D0 *)⓪ BEGIN ASSEMBLER⓪)MOVE.W #$1023,D0 ;move.b -(a3),d0⓪)CMP.B #12,D7 ;war move.b source,(a3)+ ?⓪)BNE put4201⓪)JSR MoveCut⓪)SUBQ.L #2,A4 ;clr.b (a3)+ loeschen⓪)RTS⓪ put4201 MOVE.W #$538B,(A4)+ ;subq.l #1,a3⓪)MOVE.W D0,(A4)+⓪)CLR.W D7⓪&END⓪ END put216;⓪ ⓪ PROCEDURE STPROC;⓪"BEGIN⓪$ASSEMBLER⓪)ACZ '@LREQ' ; 0⓪)ACZ '@LRNE'⓪)ACZ '@LRLE'⓪)ACZ '@LRGE'⓪)ACZ '@LRLT'⓪)ACZ '@LRGT'⓪)ACZ '@LNEG'⓪)ACZ '@LADD' ; 7⓪)ACZ '@LSUB' ; 8⓪)ACZ '@IMUL'⓪)ACZ '@CMUL'⓪)ACZ '@LMUL' ; 11⓪)ACZ '@IDIV'⓪)ACZ '@CDIV'⓪)ACZ '@LDIV' ; 14⓪)ACZ '@IMOD'⓪)ACZ '@CMOD'⓪)ACZ '@STAS'⓪)ACZ '@FNUL' ; 18⓪)ACZ '@ICHK'⓪)ACZ '@CCHK' ; 20⓪)ACZ '@WCHK'⓪)ACZ '@INCL' ; 22⓪)ACZ '@EXCL'⓪)ACZ '@STOL' ; 24⓪)ACZ '@LTOS'⓪)ACZ '@FOPS' ; 26⓪)ACZ '@FOPD' ; 27⓪)ACZ '@SMEM'⓪)ACZ '@SEQL'⓪)ACZ '@SNEQ' ; 30⓪)ACZ '@SLEQ'⓪)ACZ '@SGEQ'⓪)ACZ '@TRAN'⓪)ACZ '@IOTR'⓪)ACZ '@NEWP'⓪)ACZ '@PRIO'⓪)ACZ '@COPY' ;Open Array umkopieren⓪)ACZ '@COPS' ;Open Array umkopieren, dabei TOS.L retten⓪)ACZ '@LSTN'⓪)ACZ '@IOCA' ; 40⓪)ACZ '@STK1' ;Entry-Code f. Prozeduren, mit 0-Link⓪)ACZ '@STK2' ;Entry-Code f. Prozeduren⓪)ACZ '@RES1'⓪)ACZ '@RES2'⓪)ACZ '@RES3'⓪)ACZ '@RES4'⓪)ACZ '@RES5'⓪)ACZ '@RES6'⓪)ACZ '@RES7'⓪)ACZ '@IMLW' ; 50⓪)ACZ '@CMLW'⓪)ACZ '@IDVW'⓪)ACZ '@CDVW'⓪)ACZ '@IMDW'⓪)ACZ '@CMDW'⓪)ACZ '@IMLL' ; 56⓪)ACZ '@CMLL'⓪)ACZ '@IDVL'⓪)ACZ '@CDVL'⓪)ACZ '@IMDL'⓪)ACZ '@CMDL'⓪)ACZ '@PS3B' ; 62⓪)ACZ '@PS3W'⓪)ACZ '@PS3L'⓪)ACZ '@PS7B'⓪)ACZ '@PS7W'⓪)ACZ '@PS7L'⓪)ACZ '@COPW' ; 68⓪)ACZ '@COPL' ; 69⓪)ACZ '@CAP' DC.B 0 ; 70⓪)ACZ '@LENW' ; 71⓪)ACZ '@LENL' ; 72⓪)ACZ '@SAND' ; 73⓪)ACZ '@SXOR'⓪)ACZ '@SSUM'⓪)ACZ '@SDIF'⓪)ACZ '@SAN1' ; 77⓪)ACZ '@SXO1'⓪)ACZ '@SSU1'⓪)ACZ '@SDI1'⓪)ACZ '@SAN2' ; 81⓪)ACZ '@SXO2'⓪)ACZ '@SSU2'⓪)ACZ '@SDI2' ; 84⓪)ACZ '@FMVS' ; 85⓪)ACZ '@FMVD' ; 86⓪)ACZ '@FCPN' ; 87⓪)ACZ '@FCPS' ; 88⓪)ACZ '@FCPD' ; 89⓪)ACZ '@VFPU' ; 90⓪)ACZ '@LABS' ; 91⓪)ACZ '@SNEG' ; 92⓪)ACZ '@SABS' ; 93⓪)ACZ '@SADD'⓪)ACZ '@SSUB'⓪)ACZ '@SMUL'⓪)ACZ '@SDIV'⓪)ACZ '@SRLE'⓪)ACZ '@SRGE'⓪)ACZ '@SRLT'⓪)ACZ '@SRGT' ; 101⓪)ACZ '@LC2S' ; 102⓪)ACZ '@LI2S' ; 103⓪)ACZ '@LC2D' ; 104⓪)ACZ '@LI2D' ; 105⓪)ACZ '@S2LC' ; 106⓪)ACZ '@S2LI' ; 107⓪)ACZ '@D2LC' ; 108⓪)ACZ '@D2LI' ; 109⓪)ACZ '@SIRG' ; 110⓪)ACZ '@CWOP' ; 111⓪)ACZ '@CLOP' ; 112⓪)ACZ '@FP7S' ; 113⓪)ACZ '@FP7D' ; 114⓪)ACZ '@FP3S' ; 115⓪)ACZ '@FP3D' ; 116⓪)ACZ '@FG7S' ; 117⓪)ACZ '@FG7D' ; 118⓪)ACZ '@FG3S' ; 119⓪)ACZ '@FG3D' ; 120⓪)ACZ '@FP7M' ; 121⓪)ACZ '@FG7M' ; 122⓪)ACZ '@ROTA' ; 123⓪)ACZ '@SHFT' ; 124⓪ ⓪$END⓪"END STPROC;⓪ ⓪ FORWARD CSP1;⓪ PROCEDURE CSP;⓪ BEGIN⓪ ASSEMBLER MULU #6,D3⓪)LEA STPROC,A0⓪)ADDA.L D3,A0⓪)JMP CSP1⓪ END⓪ END CSP;⓪ ⓪ PROCEDURE CSP1;⓪ BEGIN ASSEMBLER⓪)MOVE.L A0,-(A7)⓪)JSR SearchID⓪)MOVE.L (A7)+,A0⓪)CMPI.B #6,D3 ;PROC?⓪)BEQ OK1⓪)⓪)MOVE.L A0,A2⓪)LEA BadId,A0⓪)MOVEQ #0,D0 ; optional Term-Char⓪)MOVEQ #40,D2 ; max. Length⓪)JSR FetchString⓪)MOVE #rNoRun,D5 ;NOT AVAILABLE⓪)JMP SyntaxErr⓪!⓪!!OK1 JSR Put8 ;JSR.L⓪)MOVE.L A4,D0⓪)SUB.L CodeStart,D0 ;REL ^REFERENZ⓪)MOVE.L -18(A1,D2.L),(A4)+ ;Put RELOC LINK⓪)MOVE.L D0,-18(A1,D2.L) ;NEUER LINK⓪ END⓪ END CSP1;⓪)⓪ PROCEDURE ALLOC;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪(ACZ 'Allocate' *)⓪ (*$ ? Atari:⓪(ACZ 'ALLOCATE' *)⓪(SYNC⓪&END⓪ END ALLOC;⓪ ⓪ PROCEDURE DEALL;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪(ACZ 'DeAllocate' *)⓪ (*$ ? Atari:⓪(ACZ 'DEALLOCATE' *)⓪(SYNC⓪&END⓪ END DEALL;⓪ ⓪ PROCEDURE CALLAL;⓪ BEGIN ASSEMBLER⓪)LEA ALLOC,A0⓪)JMP CSP1⓪&END⓪ END CALLAL;⓪ ⓪ PROCEDURE CALLDEAL;⓪ BEGIN ASSEMBLER⓪)LEA DEALL,A0⓪)JMP CSP1⓪'END⓪ END CALLDEAL;⓪ ə
- (* $FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158Ç$00008AF1T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$FFED5158$00008FF1$00008AF1$00008B1E$00008B2C$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158öÇâ*)
-